package cliente.negocio;


import cliente.comunicacion.Proxy;
import cliente.presentacion.administrador.beneficiarios.JF_AddBeneficiario;
import cliente.presentacion.administrador.beneficiarios.JF_Gestion_Beneficiario;
import cliente.presentacion.administrador.beneficiarios.JF_ModificarBeneficiario;
import cliente.presentacion.administrador.beneficiarios.JF_VerBeneficiarios;
import cliente.presentacion.administrador.beneficiarios.iJF_AddBeneficiario;
import cliente.presentacion.administrador.beneficiarios.iJF_Gestion_Beneficiario;
import cliente.presentacion.administrador.beneficiarios.iJF_ModificarBeneficiario;
import cliente.presentacion.administrador.beneficiarios.iJF_VerBeneficiario;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.Beneficiario;
import server.dominio.Medico;
import server.dominio.Persona;
import server.excepciones.BeneficiarioInexistenteException;
import server.excepciones.BeneficiarioNoExistenteException;
import server.excepciones.BeneficiarioYaExistenteException;
import server.excepciones.CitasPendientesException;
import server.excepciones.MedicoInexistenteException;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author tpaxle
 */
public class Controlador_Gestion_Beneficiario implements iControlador_Administrador{
    private iJF_Gestion_Beneficiario ventana_jf_gesbeneficiario;
    private iJF_VerBeneficiario ventana_jf_verbeneficiario;
    private iJF_ModificarBeneficiario ventana_jf_modificarbenefificario;
    private iJF_AddBeneficiario ventana_addBeneficiario;

    private Proxy proxy;
    private ArrayList<Beneficiario> listabeneficiarios;
    private boolean [] peticionmedico= {false, false};
    private Controlador_Administrador C_admin;
    private Beneficiario beneficiario_nomodificado;
    private ArrayList<Medico> listamedicos;
   public Controlador_Gestion_Beneficiario(Controlador_Administrador C_admin){
        ventana_jf_gesbeneficiario = new JF_Gestion_Beneficiario(this);
        ventana_jf_verbeneficiario= new JF_VerBeneficiarios(this);
        proxy= Proxy.getProxy();
        this.C_admin=C_admin;
        this.obtenerUsuarios();
    }

    public boolean accesoposible() {
        if(!peticionmedico[0]){
            if(!peticionmedico[1]){
                this.obtenerMedicos();
                peticionmedico[1]= true;
            }
        }
        return peticionmedico[0];
    }

    private void obtenerMedicos() {
        proxy.getMedicos(this.C_admin.getIdSesion());
    }



    public void nuevobeneficiario() {
        ventana_addBeneficiario= new JF_AddBeneficiario(this);
        ventana_addBeneficiario.mostrar(true);
        C_admin.getAdmin_Control().log("Abrir ventana Nuevo Beneficiario");
    }

    public void modificarbeneficiario(int index) {
        try {
            beneficiario_nomodificado = proxy.getBeneficiario(C_admin.getIdSesion(), listabeneficiarios.get(index).getNif());
            ventana_jf_modificarbenefificario = new JF_ModificarBeneficiario(this);
            
            ventana_jf_modificarbenefificario.mostrar(true);
            ventana_jf_modificarbenefificario.mostrabeneficiario(beneficiario_nomodificado);
        } catch (BeneficiarioInexistenteException ex) {
             C_admin.getAdmin_Control().log("ERROR Al modificar el medico en M.B: "+ ex);
             ventana_jf_modificarbenefificario.error(2);
        } catch (Exception ex) {
              C_admin.getAdmin_Control().log("ERROR AL Modificar Beneficiario, el medico que se intenta modificar no existe "+ ex);
              ventana_jf_modificarbenefificario.error(4);
              ventana_jf_modificarbenefificario.cerrar();
              System.exit(1);
        }

    }

    public void borrarbeneficiario(int index) {
        try {
            proxy.borrarBeneficiario(C_admin.getIdSesion(), listabeneficiarios.get(index));
            ventana_jf_gesbeneficiario.mostrar("Beneficiario ha sido eliminado");
            this.C_admin.getAdmin_Control().log("Beneficiario borrado: ");
        } catch (BeneficiarioNoExistenteException ex) {
              this.C_admin.getAdmin_Control().log("ERROR Al Borrar un Bemeficiario que no existe: "+ ex);
              ventana_jf_gesbeneficiario.error(1);
        } catch (Exception ex) {
                        Logger.getLogger(Controlador_Gestion_Beneficiario.class.getName()).log(Level.SEVERE, null, ex);
            if(ex.toString().equals("Citas")){
              this.C_admin.getAdmin_Control().log("ERROR Grave Al Borrar un Bemeficiario con citas pendientes: "+ ex);
              ventana_jf_gesbeneficiario.error(2);
            }else{
              this.C_admin.getAdmin_Control().log("ERROR Grave Al Borrar un Bemeficiario que no existe: "+ ex);

              ventana_jf_gesbeneficiario.error(1);
            }
        }
    }

    private void obtenerUsuarios() {
        proxy.getDatosTablas(C_admin.getIdSesion());
    }

    public Controlador_Administrador getC_admin() {
        return C_admin;
    }

    public void modificarbeneficiario(String[] informacion) {
       boolean seguira= false, seguirb= false;
        Beneficiario beneficiario=null;
        try {
            Medico medico = proxy.getMedico(C_admin.getIdSesion(), informacion[9]);
            Persona persona_aux= new Persona(informacion[1], informacion[2], informacion[3], informacion[4], Integer.parseInt(informacion[6]), Integer.parseInt(informacion[7]),informacion[5], informacion[8]);
            beneficiario= new Beneficiario(persona_aux, medico, informacion[0]);
            beneficiario.setIdBeneficiario_pk(beneficiario_nomodificado.getIdBeneficiario_pk());
            seguira= true;
        } catch (MedicoInexistenteException ex) {
             this.C_admin.getAdmin_Control().log("ERROR Al modificar el medico en M.B: "+ ex);
             ventana_jf_modificarbenefificario.error(2);
        } catch (Exception ex) {
             this.C_admin.getAdmin_Control().log("ERROR Al modificar el medicoem M.B: "+ ex);
             ventana_jf_modificarbenefificario.error(2);
        }
        if(!seguira){
             ventana_jf_modificarbenefificario.error(2);
        }
        else{
            if(beneficiario_nomodificado.compareTo(beneficiario)==0 && beneficiario != null){
                //No se ha modificado
                this.C_admin.getAdmin_Control().log("No se ha modificado el beneficiario: "+ beneficiario_nomodificado);
                ventana_jf_modificarbenefificario.error(1);
            }else{
                try {
                    proxy.modificar(C_admin.getIdSesion(), beneficiario);
                    ventana_jf_modificarbenefificario.cerrar();
                } catch (BeneficiarioYaExistenteException ex) {
                      this.C_admin.getAdmin_Control().log("ERROR AL Modificar Beneficiario, el Beneficiario  existe "+ ex);
                      ventana_jf_modificarbenefificario.error(2);
                } catch (BeneficiarioNoExistenteException ex){
                      this.C_admin.getAdmin_Control().log("ERROR AL Modificar Beneficiario, el medico que se intenta modificar no existe "+ ex);
                      ventana_jf_modificarbenefificario.error(2);
                } catch (Exception ex){
                    Logger.getLogger(Proxy.class.getName()).log(Level.SEVERE, null, ex);
                      this.C_admin.getAdmin_Control().log("ERROR AL Modificar Beneficiario, el medico que se intenta modificar no existe "+ ex);
                      ventana_jf_modificarbenefificario.error(1);
                }

            }
        }
    }

    public ArrayList<Beneficiario> getListabeneficiarios() {
        return listabeneficiarios;
    }

 
    public void entregarMedicos(ArrayList<Object> medicos) {
        ArrayList<Medico> lmedicos= new ArrayList<Medico>();
        this.peticionmedico[0]= true;

        for(Object aux: medicos){
            lmedicos.add((Medico)aux);
        }

        listamedicos= lmedicos;
        C_admin.getAdmin_Control().log("medicos recibidos: "+ medicos.size());
    }

    public ArrayList<Medico> getListamedicos() {
        return listamedicos;
    }
    
    public void entregarUsuariosrecibidos(ArrayList<Object> usuarios, ArrayList<Object> beneficiarios) {
        ArrayList<Beneficiario> listabeneficiario= new ArrayList<Beneficiario>();
        for(Object a: beneficiarios){
            listabeneficiario.add((Beneficiario)a);
        }
        this.listabeneficiarios= listabeneficiario;

        ventana_jf_gesbeneficiario.iniciartablabeneficiario(listabeneficiarios);
        ventana_jf_gesbeneficiario.mostrar(true);

    }

    public void mostrarBeneficiario(int index) {
        ventana_jf_verbeneficiario.mostrar(listabeneficiarios.get(index), index);
    }

    public void nuevobeneficiario(String[] informacion) {
        int resultado= 0;
        try {
            Medico med_seleccionado;
            
            Medico medico = proxy.getMedico(C_admin.getIdSesion(), informacion[9]);
            Persona persona_aux= new Persona(informacion[1], informacion[2], informacion[3], informacion[4], Integer.parseInt(informacion[6]), Integer.parseInt(informacion[7]),informacion[5], informacion[8]);
            Beneficiario beneficiario= new Beneficiario(persona_aux, medico, informacion[0]);
            proxy.nuevoBeneficiario(C_admin.getIdSesion(), beneficiario);
            resultado= 1;
            this.C_admin.getAdmin_Control().log("El beneficiario: "+ beneficiario +";\n ha sido creado");
        } catch (MedicoInexistenteException ex) {
                this.C_admin.getAdmin_Control().log("ERROR AL CRERAR Beneficiario: "+ ex);
        } catch (BeneficiarioYaExistenteException ex){
                this.C_admin.getAdmin_Control().log("ERROR AL CRERAR Beneficiario: "+ ex);
                resultado=2;
        } catch (Exception ex){
                this.C_admin.getAdmin_Control().log("ERROR AL CRERAR Beneficiario: "+ ex);
        }finally{
            switch(resultado){
                case 0:
                    ventana_addBeneficiario.error(1);
                    break;
                case 1:
                    ventana_addBeneficiario.cerrar();
                    break;
                case 2:
                    ventana_addBeneficiario.error(2);
                    break;
            }
        }
    }

    public void notificar(int noperacion, Object objeto) {
        Beneficiario beneficiario= (Beneficiario)objeto;
        Beneficiario bene_aux;
        switch(noperacion){
            case 4:
                //Insercion de beneficiario
                listabeneficiarios.add(beneficiario);
                ventana_jf_gesbeneficiario.iniciartablabeneficiario(listabeneficiarios);
                break;
            case 5:
                //Eliminacion Beneficiario
                if((bene_aux=buscarbeneficiario(beneficiario))!= null){
                    listabeneficiarios.remove(bene_aux);
                    ventana_jf_gesbeneficiario.iniciartablabeneficiario(listabeneficiarios);
                }
                break;
            case 6:
                Beneficiario auxiliar= null;
                //Modificacion de usuario, el usuario con idSesion igual al actualizado
                //apuntara al nuevo
                if((auxiliar=buscarbeneficiario(beneficiario))!= null){
                    listabeneficiarios.set(listabeneficiarios.indexOf(auxiliar), beneficiario);
                    ventana_jf_gesbeneficiario.iniciartablabeneficiario(listabeneficiarios);
                }
                break;
        }
    }
    private Beneficiario buscarbeneficiario(Beneficiario beneficiario){
        Beneficiario beneficiario_aux=null;
        for(int i=0; i< listabeneficiarios.size(); i++){
            if(listabeneficiarios.get(i).getNif().equals(beneficiario.getNif()))
                beneficiario_aux= listabeneficiarios.get(i);
        }
        return beneficiario_aux;
    }

    public void entregarCentros(ArrayList<Object> centros) {
        //No es posible que me lo envie a mi
    }
    //La ventana indica que se va a cerrar
    public void cerrar() {
        C_admin.cerrar();
    }

    public void entregarHorario(ArrayList<Object> lhora) {
        //Se ignora pero no se debe recibir
    }

    /*
     *
     *         try {
            beneficiario_nomodificado = proxy.getBeneficiario(C_admin.getIdSesion(), listabeneficiarios.get(index).getNif());
//            ventana_jf_modificarbeneficiario = new JF_ModificarBeneficiario(this);
            ventana_jf_modificarbeneficiario.mostrar(true);
            ventana_jf_modificarbeneficiario.mostrabeneficiario(beneficiario_nomodificado);
        } catch (BeneficiarioInexistenteException ex) {
             this.log("ERROR Al modificar el medico en M.B: "+ ex);
             ventana_jf_modificarbeneficiario.error(2);
        } catch (Exception ex) {
              this.log("ERROR AL Modificar Beneficiario, el medico que se intenta modificar no existe "+ ex);
              ventana_jf_administracion.error(2);
              ventana_jf_administracion.cerrar();
              System.exit(1);
        }
     */
}
